# coding=utf-8
import os
from http import HTTPStatus
from pprint import pprint

import csv

from api_server.knowledge_base.kb_service.base import KBServiceFactory
import dashscope
from jiayen.info_tool import process_segments, split_text

dashscope.api_key = "sk-245aab0a563b4ffca05f09d3f62127d3"
keys = [
    {'name': '工程名称-施工服务范围', 'keys': ['合作内容', '工程概况', '物业范围', '工程内容', '不纳入本次采购范围']},
    {'name': '合作内容-专业', 'keys': ['工程名称', '工程内容', '工程地点', '合作内容']},
    {'name': '服务区域', 'keys': ['区域', '区域*', '标段*', '服务区域', '工程承包范围']},
    {'name': '施工服务费取费标准',
     'keys': ['取费标准', '施工服务费', "451", '定额', '建设工程工程量清单计价', '建设工程计价依据', '施工费用',
              '计费依据']},
    {'name': '适用取费标准文件判断',
     'keys': ['计量和计价', '计量和计价的依据', '计价依据', '计量和计价的要求', '计费依据']},
    {'name': '合同执行期限', 'keys': ['协议生效', '合同生效', '框架合同有效期', '合同执行期限', '合同有效期']},
    {'name': '框架合同上限', 'keys': ['合同上限', '______元', '合同价款', '大写', '金额上限', '结算上限', '合同金额']},
    {'name': '增值税率/征收率', 'keys': ['增值税率', '征收率', '税率']},
    {'name': '合同折扣率（含税）', 'keys': ['合同折扣率', '中标折扣率', '折扣率', '费用折扣率', '折扣系数']},
    {'name': '合同折扣率（不含税）', 'keys': ['合同折扣率&不含税', '折扣系数&不含税']},
    {'name': '合同下浮率', 'keys': ['下浮率', '降点']},
    {'name': '合同支付条款',
     'keys': ['工程款（进度款）支付', '合同价款与支付', '支付工程款', '预付款', '进度款', '结算款']},
    {'name': '合同签订日期', 'keys': ['签署日期', '签订日期']},
    {'name': '计日工', 'keys': ['计工日', '计日工', '计工日方式', '计日工方式']},
    {'name': '建设用地及综合赔补费', 'keys': ['赔补费', '建设用地及综合赔补费', '报建赔补']},
    {'name': '建设协调费/施工协调费', 'keys': ['协调费', '建设协调费', '施工协调费']},
    {'name': '选址协调费', 'keys': ['选址费', '选址协调费']},
    {'name': '物业赔偿费', 'keys': ['赔偿费', '物业赔偿费']},
    {'name': '二次搬运费', 'keys': ['二次搬运', '搬运费', '二次搬运费']},
    {'name': '模测费', 'keys': ['模测费']},
    {'name': '标签制作费', 'keys': ['标签制作', '标签费', '标签制作费']},
    {'name': '资源录入费', 'keys': ['资源录入', '录入费', '资源录入费']},
    {'name': '搬迁设备包装及运输费用', 'keys': ['搬迁设备', '包装及运输费', '搬迁设备包装及运输费用']},
    {'name': '联合试运转调测费', 'keys': ['联调', '联调测试', '联合试运转调测费']},
    {'name': '零星材料及录入费', 'keys': ['零星材料', '录入费', '零星材料及录入费']},
    {'name': '部分取费项取消', 'keys': ['免费提供', '不计取', '不予计取', '不再计取']},
    {'name': '施工调遣费', 'keys': ['调遣费', '施工调遣费']},
    {'name': '安全文明施工费',
     'keys': ['安全文明施工', '安全文明施工费', '安全生产费', '安全及文明施工', '安全生产费的费率及支付']},
]


def search_doc(knowledge_base_name, query):
    kb = KBServiceFactory.get_service_by_name(knowledge_base_name)
    data = []
    if kb is not None:
        if query:
            docs = kb.search_docs(query, 3, 1.0)
            # data = [DocumentWithVSId(**x[0].dict(), score=x[1], id=x[0].metadata.get("id")) for x in docs]
            data = [x[0].page_content for x in docs]
    return data


'''
{"status_code": 200, "request_id": "4adb6321-14bb-9d56-a8c0-a5881677f8e9", "code": "", "message": "", "output": {"text": null, "finish_reason": null, "choices": [{"finish_reason": "stop", "message": {"role": "assistant", "content": "```json\n{\n  \"工程名称\": \"全省2022/2023年物业装维修工程\",\n  \"施工服务范围\": \"承包人按发包人所下达的采购订单要求，包工、包料（甲供材料设备除外）、包质量、包工期、包安全、包文明施工。负责安装调试等从到货至验收的所有工作\"\n}\n```"}}]}, "usage": {"input_tokens": 739, "output_tokens": 85, "total_tokens": 824}}
'''


def call_with_messages(content, fileds):
    # file = f'''<指令>根据已知信息，抽取与指定数据有关联得段落，如果无法从中得到答案，不需要做任何处理，答案请使用中文。输出格式为:{'工程名称-施工服务范围': '', '合作内容-专业': '', '服务区域': '', '施工服务费取费标准': '', '适用取费标准文件判断': '', '合同执行期限': '', '框架合同上限': '', '增值税率/征收率': '', '合同折扣率（含税）': '', '合同折扣率（不含税）': '', '合同下浮率': '', '合同支付条款': '', '合同签订日期': '', '计日工': '', '建设用地及综合赔补费': '', '建设协调费/施工协调费': '', '选址协调费': '', '物业赔偿费': '', '二次搬运费': '', '模测费': '', '标签制作费': '', '资源录入费': '', '搬迁设备包装及运输费用': '', '联合试运转调测费': '', '零星材料及录入费': '', '部分取费项取消': '', '施工调遣费': '', '安全文明施工费': ''}
    #  </指令>\n'
    # '<已知信息>{content}</已知信息>\n'
    # '<问题>抽取与{fileds}有关的段落</问题>\n'''

    # serarch = f'''<指令>根据已知信息，抽取指定的数据的结果，其以json格式返回。如果无法从中得到答案，不需要做任何处理，把json字段值置为空，答案请使用中文。输出的json格式为:工程名称-施工服务范围': '', '合作内容-专业': '', '服务区域': '', '施工服务费取费标准': '', '适用取费标准文件判断': '', '合同执行期限': '', '框架合同上限': '', '增值税率/征收率': '', '合同折扣率（含税）': '', '合同折扣率（不含税）': '', '合同下浮率': '', '合同支付条款': '', '合同签订日期': '', '计日工': '', '建设用地及综合赔补费': '', '建设协调费/施工协调费': '', '选址协调费': '', '物业赔偿费': '', '二次搬运费': '', '模测费': '', '标签制作费': '', '资源录入费': '', '搬迁设备包装及运输费用': '', '联合试运转调测费': '', '零星材料及录入费': '', '部分取费项取消': '', '施工调遣费': '', '安全文明施工费': '' </指令>\n'
    # '<已知信息>{content}</已知信息>\n'
    # '<问题>抽取{fileds}的值，以json格式返回</问题>\n'''
    # serarch = f'''<指令>根据已知信息，抽取指定的数据的结果。如果无法从中得到答案，不需要做任何处理，答案请使用中文。' </指令>\n'
    # '<已知信息>{content}，返回格式为key-value,key值统一为:data</已知信息>\n'
    # '<问题>抽取{fileds}的值</问题>\n'''
    prompt = f"从以下文本中抽取信息并按指定格式输出：\n\n{content}\n\n格式：{fileds}"
    messages = [{'role': 'system', 'content': '你是一个合同审核员'},
                {'role': 'user', 'content': prompt}]
    response = dashscope.Generation.call(
        dashscope.Generation.Models.qwen_turbo,
        messages=messages,
        result_format='message',  # 将返回结果格式设置为 message
    )
    if response.status_code == HTTPStatus.OK:
        print(response)
        with open('test.txt', 'a', encoding='utf-8') as f:
            try:
                f.write("-----" + fileds + '\n')
                data = response.output.choices[0]['message']['content']
                f.write(data + "\n")
                return data
            except:
                print('a')
        return response
    else:
        print('Request id: %s, Status code: %s, error code: %s, error message: %s' % (
            response.request_id, response.status_code,
            response.code, response.message
        ))


def load_file(path):
    from langchain.document_loaders.unstructured import UnstructuredFileLoader

    loader = UnstructuredFileLoader(path)
    docs = loader.load()
    pprint(docs)


def get_serach_template(name, keys):
    # temp = f'''{name}的内容是什么，包含的搜索关键字有{'、'.join(keys)}'''
    keys.append(name)
    temp = f'''{'、'.join(keys)}的内容是什么'''
    return temp


def get_real_data(name, content):
    return call_with_messages(content, name)


def test_1():
    hetongs = ['CMGD-202301455', 'CMGD-202100734', 'CMGD-202101992', 'CMGD-201900541', 'CMGD-202200602',
               'CMGD-202200069', 'CMGD-202000492', 'CMGD-202101745']
    # hetongs = ['CMGD-202301455']
    head = ['合同编号', '工程名称-施工服务范围', '合作内容-专业', '服务区域', '施工服务费取费标准',
            '适用取费标准文件判断', '合同执行期限', '框架合同上限', '增值税率/征收率',
            '合同折扣率（含税）', '合同折扣率（不含税）', '合同下浮率', '合同支付条款', '合同签订日期', '计日工',
            '建设用地及综合赔补费', '建设协调费/施工协调费', '选址协调费',
            '物业赔偿费', '二次搬运费', '模测费', '标签制作费', '资源录入费', '搬迁设备包装及运输费用',
            '联合试运转调测费', '零星材料及录入费', '部分取费项取消', '施工调遣费',
            '安全文明施工费']
    with open('hetong2.csv', 'w', newline='', encoding='utf-8') as file:
        writer = csv.writer(file)
        writer.writerow(head)
        for ht in hetongs:
            row = []
            row.append(ht)
            for item in keys:
                name = item['name']
                kyes = item['keys']
                con = get_serach_template(name, kyes)
                print(con)
                data = search_doc(ht, con)
                value = get_real_data(name, ''.join(data))
                value = value.replace('<回答>', '').replace('</回答>', '').replace('答案:', '').replace('数据点:',
                                                                                                        '').replace(
                    '<data>', '').replace('</data>', '')
                row.append(value)
                print(data)
            writer.writerow(row)


from file_hand import hand_file

if __name__ == '__main__':
    head = ['合同编号', '工程名称-施工服务范围', '合作内容-专业', '服务区域', '施工服务费取费标准',
            '适用取费标准文件判断', '合同执行期限', '框架合同上限', '增值税率/征收率',
            '合同折扣率（含税）', '合同折扣率（不含税）', '合同下浮率', '合同支付条款', '合同签订日期', '计日工',
            '建设用地及综合赔补费', '建设协调费/施工协调费', '选址协调费',
            '物业赔偿费', '二次搬运费', '模测费', '标签制作费', '资源录入费', '搬迁设备包装及运输费用',
            '联合试运转调测费', '零星材料及录入费', '部分取费项取消', '施工调遣费',
            '安全文明施工费']
    print(','.join(head))
    con = get_serach_template('', head)
    # print(con)
    '''
    CMGD-202301455
    CMGD-202100734
    CMGD-202101992
    CMGD-202000492
    CMGD-202101745

    '''
    hetongs = ['CMGD-202301455', 'CMGD-202100734', 'CMGD-202101992', 'CMGD-201900541', 'CMGD-202200602',
               'CMGD-202200069', 'CMGD-202000492', 'CMGD-202101745']
    hetongs = ['CMGD-201900541', 'CMGD-202200602', 'CMGD-202200069']
    final_result = []
    for ht in hetongs:
        data = search_doc(ht, con)
        segments = split_text(''.join(data), max_length=1000)
        results = process_segments(segments, ht)
        results.append(ht)
        final_result.append(results)
        print(results)
    hand_file(final_result)
    # path = 'D:\mywork\imgs\合同\大模型测试合同\大模型测试合同\data\CMGD-201900541'
    # result = []
    # content = f'''
    # [附件5 ：商务规范书(标段2）.docx]</a>\n\n工程范围：___中国移动2020年至2021年骨干汇聚+接入+无线基站（含基站末端管线接入）通信设备安装工程施工服务\n\n工程内容：按甲方审定的施工图设计的内容\n\n承包范围：按甲方审定的施工图设计的工程量及双方确认追加的工程量\n\n承包方式：包工包 __部分乙供__ 材料\n\n1.2开工日期（群体工程以第一个开工的单项工程为准）： 合同签订之日\n\n交工日期（群体工程以最后一个交工的单项工程为准）：_2021___年_12_月_31_日\n\n1.3质量等级：     合格\n\n", "<span>出处 [2]</span><a href='/law/knowledge_base/download_doc?knowledge_base_name=CMGD-202000492&file_name=%E9%99%84%E4%BB%B65+%EF%BC%9A%E5%95%86%E5%8A%A1%E8%A7%84%E8%8C%83%E4%B9%A6%28%E6%A0%87%E6%AE%B52%EF%BC%89.docx'> [附件5 ：商务规范书(标段2）.docx]</a>\n\n8.3乙方负责按照甲方审定的施工图设计和工程相关要求进行施工，确保工程按时保质完成。\n\n8.4 乙方要负责解决现场施工的准备工作。承担施工安全保卫工作施工照明的责任和要求：严格按照国家及当地政府的有关规定进行，根据工程需要，提供和维修施工照明、围栏设施、警告信号和警卫，负责施工现场安全保卫，并对上述义务承担全部责任及费用。乙方未履行义务，造成工程损坏、财产损失和人身伤害等，乙方承担所有责任及所发生的费用。\n\n", "<span>出处 [3]</span><a href='/law/knowledge_base/download_doc?knowledge_base_name=CMGD-202000492&file_name=%E9%99%84%E4%BB%B65+%EF%BC%9A%E5%95%86%E5%8A%A1%E8%A7%84%E8%8C%83%E4%B9%A6%28%E6%A0%87%E6%AE%B52%EF%BC%89.docx'> [附件5 ：商务规范书(标段2）.docx]</a>\n\n质量检查和返工 第十五条    工程质量 第十六条    隐蔽工程和中间验收 第十七条    材料检验和中间检验 第十八条    合同价款的调整 第十九条    预付工程款 第二十条    工程量的核实确认 第二十一条  工程款（进度款）支付 第二十二条  甲方供应材料设备 第二十三条  乙方采购材料设备 第二十四条  设计变更 第二十五条  工程完工 第二十六条  工程试运行 第二十七条  竣工验收 第二十八条  竣工结算 第二十九条  保修 第三十条    争议 第三十一条  违约\n\n"
    # '''
    # call_with_messages(content,'工程名称-施工服务范围')
    # for item in os.listdir(path):
    #     # with open(os.path.join(path, item), 'r', encoding='utf-8') as f:
    #         load_file(os.path.join(path, item))
    #         # lines = f.readlines()
    #         # data = '\n'.join(lines)
    #         # if len(data) > 6000:
    #         #     print(os.path.join(path, item),len(data))
    #         # result.append(''.join(lines))
    #         # call_with_messages('\n'.join(lines),
    #         #                    '合作内容、工程概况、物业范围、工程内容、不纳入本次采购范围、工程名称、工程内容、工程地点、合作内容、区域、区域*、标段*、服务区域、工程承包范围、取费标准、施工服务费、451、定额、建设工程工程量清单计价、建设工程计价依据、施工费用、计费依据、计量和计价、计量和计价的依据、计价依据、计量和计价的要求、计费依据、协议生效、合同生效、框架合同有效期、合同执行期限、合同有效期、合同上限、______元、合同价款、大写、金额上限、结算上限、合同金额、增值税率、征收率、税率、合同折扣率、中标折扣率、折扣率、费用折扣率、折扣系数、合同折扣率&不含税、折扣系数&不含税、下浮率、降点、工程款（进度款）支付、合同价款与支付、支付工程款、预付款、进度款、结算款、签署日期、签订日期、计工日、计日工、计工日方式、计日工方式、赔补费、建设用地及综合赔补费、报建赔补、协调费、建设协调费、施工协调费、选址费、选址协调费、赔偿费、物业赔偿费、二次搬运、搬运费、二次搬运费、模测费、标签制作、标签费、标签制作费、资源录入、录入费、资源录入费、搬迁设备、包装及运输费、搬迁设备包装及运输费用、联调、联调测试、联合试运转调测费、零星材料、录入费、零星材料及录入费、免费提供、不计取、不予计取、不再计取、调遣费、施工调遣费、安全文明施工、安全文明施工费、安全生产费、安全及文明施工、安全生产费的费率及支付')
    #         # break
